4주차 Q&A 및 보충

Q. return과 print의 차이는 무엇인가요?

A. return은 함수에서 수행된 값을 반환해줍니다. print는 지정된 내용을 화면에 출력해줍니다.
함수 내에서 수행되는 내용은 휘발성으로 함수가 종료되면 값이 사라지기때문에 return이 필요합니다.
자세한 내용은 아래를 참조합니다.


In [19]:
def ex_func(ltr):
    ltr = 1
    print ltr # 변수 ltr을 print로 출력했습니다.
    
ex_func('a') # 입력된 변수가 잘 출력되었습니다.


1

위의 코드에서 우리는 함수 'ex_func'이 함수 내에서 입력받은 변수를 잘 출력해주는 것을 확인했습니다.
그러면 만약 변수 var에 ex_func(ltr)을 넣으면 어떻게 될까요?

var = ex_func(ltr)

위와 같이 지정했을 경우 변수 var는 1의 값을 가질까요?
아래의 코드를 봅시다


In [24]:
def ex_func(ltr):
    ltr = 1
    print ltr
    
var = ex_func('a')


1

언뜻보면 지정한 값이 잘 대입된듯합니다.
하지만 실제론 그렇지 않습니다. 여전히 함수 내에 있는 print 명령문을 수행했을뿐,
변수 var에 1이 있는지는 알 수 없습니다.
계속 아래의 코드를 봅니다.


In [30]:
def ex_func(ltr):
    ltr = 1
    print ltr
    
var = ex_func('a')
print var # None이 출력됩니다. 실제로는 var에 아무런 값도 없다는 뜻입니다.

var + 1 # TypeError가 발생합니다. 실제로 var이 아무런 값도 가지지 않았기 때문입니다.


1
None
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-30-eac0b4315477> in <module>()
      6 print var # None이 출력됩니다. 실제로는 var에 아무런 값도 없다는 뜻입니다.
      7 
----> 8 var + 1 # TypeError가 출력됩니다. 실제로 var이 아무런 값도 가지지 않았기 때문입니다.

TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'

그럼 함수 ex_func이 값을 가지게 하려면 어떻게 해야할까요?
함수 내에서 실행된 결과를 ex_func이 돌려받아야합니다.
이 돌려받는 것을 반환이라하고, return으로 표현합니다. 아래의 예시를 살펴보겠습니다.


In [33]:
def ex_func(ltr):
    ltr = 1
    return ltr # print가 return으로 바뀌었습니다.
    
ex_func('a') # 언뜻보면 별반 다를게 없어보입니다.
var = ex_func('a')
print var


1

이번엔 정확히 1이 출력됩니다. 이는 함수문 내에서 지정된 값으로, 원래는 함수를 벗어나면 사라졌어야합니다.
하지만 return에 의해 반환되어 함수를 벗어났음에도 값이 계속 유지되고있습니다.

return ltr

이 return 덕분에 함수 ex_func 내에서 지정된 ltr값이 ex_func로 반환된 것입니다. 마지막으로 살펴보겠습니다.


In [34]:
def ex_func(ltr):
    ltr = 1
    return ltr 

var = ex_func('a')
var + 1


Out[34]:
2

덧셈이 정상적으로 작동하여 2가 출력되었습니다.
아까는 var이 None이어서 연산이 수행되지 않았는데,
이번에는 var이 1로 제대로 지정되어있어 var + 1이 제대로 작동합니다.

3주차 Q&A 및 보충

Q. if text[i] != 'a' and text[i] != 'e' and text[i] != 'i'and text[i] != 'o'and text[i] != 'u' and text[i] != 'A' and text[i] != 'E' and text[i] != 'I' and text[i] != 'O' and text[i] != 'U': 이런 단순 조건문 줄이는 방법없을까요???

A. 위의 경우에는 간단합니다. if x in y: 명령어로 x가 y에 포함되어있는지를 확인할 수 있습니다.


In [21]:
text = ['r', 'a', 'n', 'd', 'o', 'm']
text_filter = 'aeiouAEIOU'

for ltr in text:
    if ltr in text_filter:
        print ltr


a
o

7.1.12

  • Define a function called print_list that has one argument called x.
  • Inside that function, print out each element one by one. Use the existing code as a scaffold.
  • Then call your function with the argument n.

In [8]:
# range(x, y): x이상 y미만의 숫자를 list 타입으로 반환합니다.

lists = range(1, 11)
print type(lists)
print lists


<type 'list'>
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

7.1.15

  • Create a function that returns the sum of a list of numbers.
  • On line 3, define a function called total that accepts one argument called numbers. It will be a list.
  • Inside the function, create a variable called result and set it to zero.
  • Using one of the two methods above, iterate through the numbers list.
  • For each number, add it to result.
  • Finally, return result.

for문

  • for x in y:
    • 아주 단순하게 설명하면 y의 원소들이 '순차적으로' x로 대입됩니다.
  • for x in [1, 2, 3]:
    • 위의 예시에서는 변수 x에 차례대로 1, 2, 3이 대입됩니다.
  • 그대로 이어서, for문은 대입되는 이 변수들에 대해서 동일한 명령을 반복수행합니다.
  • 반복수행되는 명령은 for문 이하에 들여쓰기로 표현합니다. 아래의 예시를 확인합니다.

In [10]:
for x in [1, 2, 3]:  # x에 1, 2, 3이 반복적으로 대입되면서
    print x  # 들여쓰기로 표현된 해당 라인의 명령문이 반복적으로 수행됩니다.


1
2
3
  • 결론적으로 x에 1, 2, 3이 순차적으로 대입된다는 의미는
    x = 1, x = 2, x = 3이 순차적으로 수행된다는 의미입니다.
  • 이후 x = 1, x = 2, x = 3이 순차적으로 수행되는 동안
    들여쓰기로 표현된 for문 안의 print x를 반복수행합니다.
  • 결국 위의 코드를 풀면 아래와 같습니다.

In [12]:
for x in [1, 2, 3]:
    print x
    
x = 1  
print x  
x = 2  
print x  
x = 3  
print x  

# 수행결과가 완벽하게 동일합니다.


1
2
3
1
2
3